<

ルートとナビゲーターのリファクタリング

まとめ

Routeクラスはオーバーレイ内のオーバーレイ エントリを管理しなくなりました。 そしてそのinstall()メソッドはもうありませんinsertionPointパラメータ。 のisInitialRouteの財産RouteSetting廃止されました、 とNavigator.pop()値を返さなくなりました。

コンテクスト

新しいページ API に備えてナビゲーター API をリファクタリングしました。 そして、Routerで概説されているウィジェット のルーター設計書。 このリファクタリングにより、関数シグネチャの変更がいくつか導入されました 既存のナビゲーター API を引き続き機能させるため 新しいページ API を使用します。

変更内容の説明

ブール値の戻り値は、Navigator.pop()元気がなかった 定義されており、ユーザーは次の呼び出しによって同じ結果を達成できます。Navigator.canPop()。 API以来、Navigator.canPop()より適切に定義された、 私たちは簡略化しましたNavigator.pop()ブール値を返さないようにします。

一方、ナビゲーターには次のような能力が求められます。 オーバーレイ内のエントリを手動で再配置して、 ユーザーは新しい API でルート履歴を変更できます。 ルートが作成と破棄のみになるように変更しました。 ナビゲータがオーバーレイ エントリを挿入するか、 オーバーレイからオーバーレイ エントリを削除します。 また、insertionPointの議論Route.install()変更後は廃止されたため。

最後に、isInitialRouteからの財産RouteSettingリファクタリングの一環として、onGenerateInitialRoutesを完全に制御するための API 初期ルートの生成。

移行ガイド

ケース 1: アプリが依存するものpop()ブール値を返します。

TextField(
  onTap: () {
    if (Navigator.pop(context))
      print(There still is at least one route after pop);
    else
      print(Oops! No more routes.);
  }
)

使用できますNavigator.canPop()と組み合わせてNavigator.pop()同じ結果を達成するために。

TextField(
  onTap: () {
    if (Navigator.canPop(context))
      print(There still is at least one route after pop);
    else
      print(Oops! No more routes.);
    // Our navigator pops the route anyway.
    Navigator.pop(context);
  }
)

ケース 2: アプリは以下に基づいてルートを生成します。isInitialRoute

MaterialApp(
  onGenerateRoute: (RouteSetting setting) {
    if (setting.isInitialRoute)
      return FakeSplashRoute();
    else
      return RealRoute(setting);
  }
)

この変更を移行するにはさまざまな方法があります。 1 つの方法は、初期ルート名を設定することです。 固定値に設定して特定のルートを生成する (FakeSplashRoute上の例では) 路線名に。

MaterialApp(
  initialRouteName: fakeSplash,
  onGenerateRoute: (RouteSetting setting) {
    if (setting.name == fakeSplash)
      return FakeSplashRoute();
    else
      return RealRoute(setting);
  }
)

より複雑なユースケースがある場合は、 新しい API を使用できます。onGenerateInitialRoutes、 のMaterialAppまたCupertinoApp

MaterialApp(
  onGenerateRoute: (RouteSetting setting) {
    return RealRoute(setting);
  },
  onGenerateInitialRoutes: (String initialRouteName) {
    return <Route>[FakeSplashRoute()];
  }
)

タイムライン

リリースされたバージョン: 1.16.3
安定版リリース: 1.17

参考文献

設計ドキュメント:

API ドキュメント:

  • Route
  • Route.install
  • RouteSetting.isInitialRoute
  • Navigator
  • Navigator.pop
  • Navigator.canPop

関連する問題:

  • 問題 45938: ルーター

関連する PR:

  • PR 44930- 新しいナビゲーション システムで引き続き動作するように命令型 API をリファクタリングします